#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
djangoambari_jinja2
~~~~~~~~~~~~

Adds support for Jinja2 to Django.

Configuration variables:

======================= =============================================
Key                     Description
======================= =============================================
`JINJA2_TEMPLATE_DIRS`  List of template folders
`JINJA2_EXTENSIONS`     List of Jinja2 extensions to use
`JINJA2_CACHE_SIZE`     The size of the Jinja2 template cache.
======================= =============================================

:copyright: (c) 2009 by the Jinja Team.
:license: BSD.
"""

from itertools import chain
from django.conf import settings
from django.http import HttpResponse
from django.core.exceptions import ImproperlyConfigured
from django.template.context import get_standard_processors
from django.template import TemplateDoesNotExist
from ambari_jinja2 import Environment, FileSystemLoader, TemplateNotFound
from ambari_jinja2.defaults import DEFAULT_NAMESPACE


# the environment is unconfigured until the first template is loaded.
_jinja_env = None


def get_env():
  """Get the Jinja2 env and initialize it if necessary."""
  global _jinja_env
  if _jinja_env is None:
    _jinja_env = create_env()
  return _jinja_env


def create_env():
  """Create a new Jinja2 environment."""
  searchpath = list(settings.JINJA2_TEMPLATE_DIRS)
  return Environment(
    loader=FileSystemLoader(searchpath),
    auto_reload=settings.TEMPLATE_DEBUG,
    cache_size=getattr(settings, "JINJA2_CACHE_SIZE", 50),
    extensions=getattr(settings, "JINJA2_EXTENSIONS", ()),
  )


def get_template(template_name, globals=None):
  """Load a template."""
  try:
    return get_env().get_template(template_name, globals=globals)
  except TemplateNotFound as e:
    raise TemplateDoesNotExist(str(e))


def select_template(templates, globals=None):
  """Try to load one of the given templates."""
  env = get_env()
  for template in templates:
    try:
      return env.get_template(template, globals=globals)
    except TemplateNotFound:
      continue
  raise TemplateDoesNotExist(", ".join(templates))


def render_to_string(template_name, context=None, request=None, processors=None):
  """Render a template into a string."""
  context = dict(context or {})
  if request is not None:
    context["request"] = request
    for processor in chain(get_standard_processors(), processors or ()):
      context.update(processor(request))
  return get_template(template_name).render(context)


def render_to_response(
  template_name, context=None, request=None, processors=None, mimetype=None
):
  """Render a template into a response object."""
  return HttpResponse(
    render_to_string(template_name, context, request, processors), mimetype=mimetype
  )
